home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / DDJMAG / DDJ9207.ZIP / ACOMP.ZIP / UCOMP.C < prev    next >
C/C++ Source or Header  |  1991-12-24  |  4KB  |  162 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <alloc.h>
  4. #include <conio.h>
  5. #include <string.h>
  6.  
  7. #include "uc.h"
  8. #include "doscalls.h"
  9.  
  10.  
  11. // Define memory allocation functions.    If using DOS memory allocation
  12. // functions, provided through DOSCALLS, then set the conditional compilation
  13. // 'DOSALLOC' to true.  If using C compiler library function memory allocation
  14. // set 'DOSALLOC' to zero.
  15.  
  16. #define DOSALLOC 0
  17. // Redirect memory allocation to either DOS memory allocate functions located
  18. // in DOSCALLS or to C library far memory allocation functions.
  19. unsigned char far * far memalloc(long int siz)
  20. {
  21.     #if DOSALLOC
  22.         return(fmalloc(siz));  // DOS far memory allocation functions
  23.     #else
  24.         return(farmalloc(siz)); // C's far memory allocation functions.
  25.     #endif
  26. }
  27.  
  28. void far memfree(char far *memory)
  29. {
  30.     #if DOSALLOC
  31.         ffree(memory);
  32.     #else
  33.         farfree(memory);
  34.     #endif
  35. }
  36.  
  37. unsigned int ABXframe(char far *scratch,char far *dest,int frameno,int fhand,int far *freq);
  38.  
  39. void main(argc,argv)
  40. int argc;
  41. char **argv;
  42. {
  43.     long int siz;
  44.     int compressed = 0,fhand,abxfhand;
  45.     unsigned int len;
  46.     unsigned char far *seg=0,far *nseg;
  47.     int TotalFrames=0,FrameNo=0,freq=9000;    // Total number of frames.
  48.     unsigned int bsize=65535;
  49.     long int TotSiz;    // Total size of all frames, uncompressed.
  50.  
  51.     if ( argc != 2 )
  52.     {
  53.         writeln("Usage: UCOMP <filename>\n");
  54.         writeln("Where <filename> is an ACOMP compressed sound file.\n");
  55.         writeln("ACOMP compressed files end with the extension of .ABT.\n");
  56.         writeln("or extended ACOMP files with the extention of .ABX.\n");
  57.         writeln("UCOMP written by John W. Ratcliff, 1991\n");
  58.         exit(1);
  59.     }
  60.     len = strlen(argv[1]);                 // Get the length of this string.
  61.     if (len > 4)
  62.     {
  63.         strupr( argv[1] );
  64.     if (strcmp( &argv[1][len-4], ".ABT") == 0 )
  65.         {
  66.             compressed = 2;
  67.             seg = fload(argv[1], &siz);
  68.         }
  69.         if (strcmp( &argv[1][len-4], ".ABX") == 0 )
  70.         {
  71.             compressed = 3;
  72.             abxfhand = mfopen(argv[1], &siz, OLD_FILE); // Open the sound file.
  73.             if ( abxfhand )
  74.             {
  75.                 mfread(&TotalFrames, 2L, abxfhand);  // Read in the total number of frames.
  76.                 mfread(&TotSiz, 4L, abxfhand); // Read in the total size of the original file.
  77.                 mfread(&bsize, 2L, abxfhand); // Find the buffer size, in bytes.
  78.                 mfread(&freq, 2L, abxfhand); // Find the playback frequency.
  79.                 seg = memalloc(bsize); // Allocate the memory for scratch buffer..
  80.             }
  81.         }
  82.     }
  83.  
  84.     if ( !compressed )
  85.     {
  86.         writeln("File '");
  87.         writeln(argv[1]);
  88.         writeln("' is not a compressed file.\n");
  89.         exit(1);
  90.     }
  91.  
  92.     if ( !seg )
  93.     {
  94.         writeln("Unable to load file '");
  95.         writeln(argv[1]);
  96.         writeln("'.\n");
  97.         exit(1);
  98.     }
  99.  
  100.     nseg = memalloc(bsize);
  101.     if (!nseg)
  102.     {
  103.         writeln("Couldn't allocate memory.\n");
  104.         exit(1);
  105.     }
  106.  
  107.     if ( compressed == 2 )
  108.     {
  109.         writeln("Decompressing ACOMP compressed sound sample.\n");
  110.         siz = (long) UnCompressAudio( seg, nseg );
  111.     }
  112.  
  113.     argv[1][len-3] = '8';
  114.     argv[1][len-2] = 'S';
  115.     argv[1][len-1] = 'N';
  116.  
  117.     writeln("Saving uncompressed sound file as '");
  118.     writeln(argv[1]);
  119.     writeln("'.\n");
  120.     fhand = mfopen(argv[1], 0, NEW_FILE);
  121.     if ( !fhand )
  122.     {
  123.         writeln("Failure to open output file.\n");
  124.         exit(1);
  125.     }
  126.     if ( compressed == 1 || compressed == 2 )
  127.     {
  128.         mfwrite(nseg, siz, fhand);
  129.     }
  130.     else
  131.     {
  132.         FrameNo = 0;
  133.         for ( FrameNo=0; FrameNo<TotalFrames; FrameNo++)
  134.         {
  135.             siz = ABXframe(seg,nseg,FrameNo,abxfhand,&freq);    //Load an ABX frame.
  136.             mfwrite(nseg, siz, fhand); // Write it out to disk.
  137.         }
  138.         mfclose(abxfhand);
  139.     }
  140.     mfclose(fhand);
  141.  
  142.     memfree(seg);     // Read buffer.
  143.     memfree(nseg);    // Scratch decompress buffer.
  144. }
  145.  
  146. // Reads a particular frame of ACOMP compressed data from an ABX file and
  147. // decompresses it into the destination buffer.
  148. unsigned int ABXframe(char far *scratch,char far *dest,int frameno,int fhand,int far *freq)
  149. {
  150.     long int seekloc;
  151.     ABH ABHEAD;
  152.  
  153.     seekloc = frameno*sizeof(ABH)+10L;
  154.     mfseek(fhand,seekloc);
  155.     mfread(&ABHEAD, sizeof(ABH), fhand); // Read in an ABX header.
  156.     mfseek(fhand,ABHEAD.fileaddress); // Seek to frame location.
  157.     mfread(scratch, ABHEAD.fsize, fhand);  // Read compressed data frame.
  158.     *freq = GetFreq(scratch);
  159.     return( UnCompressAudio(scratch,dest) );
  160. }
  161.  
  162.